package cn.tedu.mall.seckill.service.impl;

import cn.tedu.mall.common.exception.CoolSharkServiceException;
import cn.tedu.mall.common.restful.ResponseCode;
import cn.tedu.mall.pojo.product.vo.SkuStandardVO;
import cn.tedu.mall.pojo.seckill.model.SeckillSku;
import cn.tedu.mall.pojo.seckill.vo.SeckillSkuVO;
import cn.tedu.mall.product.service.seckill.IForSeckillSkuService;
import cn.tedu.mall.seckill.mapper.SeckillSkuMapper;
import cn.tedu.mall.seckill.service.ISeckillSkuService;
import cn.tedu.mall.seckill.utils.SeckillCacheUtils;
import org.apache.commons.lang.math.RandomUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Service
public class SeckillSkuServiceImpl implements ISeckillSkuService {
    //获取sku的秒杀信息
    @Autowired
    private SeckillSkuMapper seckillSkuMapper;

    //获取sku的详细信息
    @DubboReference
    private IForSeckillSkuService dubboSeckillSkuService;

    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public List<SeckillSkuVO> listSeckillSkus(Long spuId) {
        //获取秒杀的sku列表
        List<SeckillSku> seckillSkus = seckillSkuMapper.findSeckillSkusBySpuId(spuId);
        //判断seckillSkus是否为null
        if (seckillSkus == null){
            throw new CoolSharkServiceException(ResponseCode.BAD_REQUEST,"请求出现异常，请重试");
        }

        ArrayList<SeckillSkuVO> seckillSkuVOS = new ArrayList<>();
        for (SeckillSku seckillSku : seckillSkus) {
            SeckillSkuVO seckillSkuVO=null;
            Long skuId = seckillSku.getSkuId();
            String seckillSkuVOKey = SeckillCacheUtils.getSeckillSkuVOKey(skuId);
            if (redisTemplate.hasKey(seckillSkuVOKey)){
                seckillSkuVO=(SeckillSkuVO) redisTemplate.boundValueOps(seckillSkuVOKey).get();
            }else {
                //如果缓存中不存在，该查询数据库了
                SkuStandardVO skuStandardVO = dubboSeckillSkuService.getById(skuId);
                seckillSkuVO=new SeckillSkuVO();
                BeanUtils.copyProperties(skuStandardVO,seckillSkuVO);
                seckillSkuVO.setSeckillPrice(seckillSku.getSeckillPrice());//获取秒杀价格
                seckillSkuVO.setSeckillLimit(seckillSku.getSeckillLimit());//获取商品限购数量
                seckillSkuVO.setStock(seckillSku.getSeckillStock());//获取秒杀商品库存
                //缓存到redis中以备后续使用
                redisTemplate.boundValueOps(seckillSkuVOKey).set(seckillSkuVO,2*60*60+ RandomUtils.nextInt(100), TimeUnit.SECONDS);
            }

            seckillSkuVOS.add(seckillSkuVO);
        }

        return seckillSkuVOS;
    }
}
